/*
 * @lc app=leetcode.cn id=227 lang=javascript
 *
 * [227] 基本计算器 II
 */

// @lc code=start
/**
 * @param {string} s
 * @return {number}
 */
// var calculate = function(s) {
//   let preSing = '+';
//   let stack = [];
//   let num = 0;
//   for(let i = 0; i<s.length; i++ ){
//     if(!isNaN(Number(s[i])) && s[i]!= ' '){
//       num = num*10 + Number(s[i]);
//     }
//     if (isNaN(Number(s[i])) || i === s.length-1) {
//       switch (preSing) {
//         case '+':
//           stack.push(num);
//           break;
//         case '-':
//           stack.push(-num);
//           break;
//         case '*':
//           stack.push(stack.pop() * num);
//           break;
//         default: 
//           stack.push(stack.pop() / num | 0);
//           break;
//       }
//       preSing = s[i];
//       num = 0;
//     }
//   }
//   return stack.reduce((a,b)=>{
//     return a + b;
//   }, 0)
// };



/**
 * 复习 2021-08-04
 */
var calculate = function(s) {
  let i = 0;
  let str = '';
  let stack = [];
  let preOp = 0; // 标记上一个运算符状态 0 +， 1 -， 2 *， 3 /
  while(str = s[i]) {
    if(str === ' ') {
      i++;
      continue;
    }

    let val = str;

    if(str >= '0' && str <= '9'){
      let j = i + 1;
      while(s[j] >= '0' && s[j] <= '9') {
        val += s[j];
        i++;
        j++;
      }
    }
    
    switch(val) {
      case '+': 
        preOp = 0;
        break;
      case '-': 
        preOp = 1;
        break;
      case '*': 
        preOp = 2;
        break;
      case '/': 
        preOp = 3;
        break;
      default:  // 数字
        if(preOp === 1) { // 减
          let temp = -val;
          stack.push(temp);
        } else if(preOp === 2) {
          let temp = stack.pop() * val;
          stack.push(temp);
        } else if(preOp === 3) {
          let temp = (stack.pop() / val) | 0;
          stack.push(temp);
        } else { // 加
          stack.push(val);
        }
        break;
    }
    i++;
  }
  let ret = stack.reduce((a,b)=> +a + +b, 0)
  return ret;
}
// @lc code=end

